/*!
 * bsCustomFileInput v1.3.1 (https://github.com/Johann-S/bs-custom-file-input)
 * Copyright 2018 Johann-S <johann.servoire@gmail.com>
 * Licensed under MIT (https://github.com/Johann-S/bs-custom-file-input/blob/master/LICENSE)
 */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
		typeof define === 'function' && define.amd ? define(factory) :
			(global.bsCustomFileInput = factory());
}(this, (function () {
	'use strict';

	var Selector = {
		CUSTOMFILE: '.custom-file input[type="file"]',
		CUSTOMFILELABEL: '.custom-file-label',
		FORM: 'form',
		INPUT: 'input'
	};

	var textNodeType = 3;

	var getDefaultText = function getDefaultText(input) {
		var defaultText = '';
		var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL);

		if (label) {
			defaultText = label.innerHTML;
		}

		return defaultText;
	};

	var findFirstChildNode = function findFirstChildNode(element) {
		if (element.childNodes.length > 0) {
			var childNodes = [].slice.call(element.childNodes);

			for (var i = 0; i < childNodes.length; i++) {
				var node = childNodes[i];

				if (node.nodeType !== textNodeType) {
					return node;
				}
			}
		}

		return element;
	};

	var restoreDefaultText = function restoreDefaultText(input) {
		var defaultText = input.bsCustomFileInput.defaultText;
		var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL);

		if (label) {
			var element = findFirstChildNode(label);
			element.innerHTML = defaultText;
		}
	};

	var fileApi = !!window.File;
	var FAKE_PATH = 'fakepath';
	var FAKE_PATH_SEPARATOR = '\\';

	var getSelectedFiles = function getSelectedFiles(input) {
		if (input.hasAttribute('multiple') && fileApi) {
			return [].slice.call(input.files).map(function (file) {
				return file.name;
			}).join(', ');
		}

		if (input.value.indexOf(FAKE_PATH) !== -1) {
			var splittedValue = input.value.split(FAKE_PATH_SEPARATOR);
			return splittedValue[splittedValue.length - 1];
		}

		return input.value;
	};

	function handleInputChange() {
		var label = this.parentNode.querySelector(Selector.CUSTOMFILELABEL);

		if (label) {
			var element = findFirstChildNode(label);
			var inputValue = getSelectedFiles(this);

			if (inputValue.length) {
				element.innerHTML = inputValue;
			} else {
				restoreDefaultText(this);
			}
		}
	}

	function handleFormReset() {
		var customFileList = [].slice.call(this.querySelectorAll(Selector.INPUT)).filter(function (input) {
			return !!input.bsCustomFileInput;
		});

		for (var i = 0, len = customFileList.length; i < len; i++) {
			restoreDefaultText(customFileList[i]);
		}
	}

	var customProperty = 'bsCustomFileInput';
	var Event = {
		FORMRESET: 'reset',
		INPUTCHANGE: 'change'
	};
	var bsCustomFileInput = {
		init: function init(inputSelector, formSelector) {
			if (inputSelector === void 0) {
				inputSelector = Selector.CUSTOMFILE;
			}

			if (formSelector === void 0) {
				formSelector = Selector.FORM;
			}

			var customFileInputList = [].slice.call(document.querySelectorAll(inputSelector));
			var formList = [].slice.call(document.querySelectorAll(formSelector));

			for (var i = 0, len = customFileInputList.length; i < len; i++) {
				var input = customFileInputList[i];
				Object.defineProperty(input, customProperty, {
					value: {
						defaultText: getDefaultText(input)
					},
					writable: true
				});
				input.addEventListener(Event.INPUTCHANGE, handleInputChange);
			}

			for (var _i = 0, _len = formList.length; _i < _len; _i++) {
				formList[_i].addEventListener(Event.FORMRESET, handleFormReset);

				Object.defineProperty(formList[_i], customProperty, {
					value: true,
					writable: true
				});
			}
		},
		destroy: function destroy() {
			var formList = [].slice.call(document.querySelectorAll(Selector.FORM)).filter(function (form) {
				return !!form.bsCustomFileInput;
			});
			var customFileInputList = [].slice.call(document.querySelectorAll(Selector.INPUT)).filter(function (input) {
				return !!input.bsCustomFileInput;
			});

			for (var i = 0, len = customFileInputList.length; i < len; i++) {
				var input = customFileInputList[i];
				restoreDefaultText(input);
				input[customProperty] = undefined;
				input.removeEventListener(Event.INPUTCHANGE, handleInputChange);
			}

			for (var _i2 = 0, _len2 = formList.length; _i2 < _len2; _i2++) {
				formList[_i2].removeEventListener(Event.FORMRESET, handleFormReset);

				formList[_i2][customProperty] = undefined;
			}
		}
	};

	return bsCustomFileInput;

})));
